/**
 * 环形队列的顺序存储(队首和队尾指针顺时钟旋转)
 * 
 */
#include <stdio.h>
#include <stdlib.h>

#define MAX_SIZE 50
#define bool int
#define true !0
#define false 0
#define ElemType int

typedef struct{
	ElemType data[MAX_SIZE];	//存放队列元素
	int front;					//存放头部索引,指向队首元素
	int rear;					//存放尾部索引,指向队尾元素的下一个空间(空白空间)->牺牲一个空间来存放队尾指针
}SQueue;


//初始化
void init(SQueue &Q);

//判断队列是否为空
bool isEmpty(SQueue &Q);

//判断队列是否已满
bool isFull(SQueue &Q);

//入队
bool EnQueue(SQueue &Q, ElemType data);

//出队
bool DeQueue(SQueue& Q, ElemType& e);

//队列中元素的个数
int Length(SQueue& Q);

//展示当前队列中的元素
void print(SQueue &queue);

int main()
{
	
	return 0;
}


void init(SQueue &Q)
{
	Q.rear = Q.front = 0;	//初始化队首队尾指针
}

bool isEmpty(SQueue &Q)
{
	return Q.front == Q.rear ? true : false;	
}

bool isFull(SQueue &Q)
{
	return ((Q.rear + 1) % MAX_SIZE == Q.front) ? true : false; 
}

bool EnQueue(SQueue &Q, ElemType data)
{
	if((Q.rear + 1)%MAX_SIZE == Q.front) return false;	//判断队列是否已满
	Q.data[Q.rear] = data;
	Q.rear = (Q.rear + 1) % MAX_SIZE;	//队尾指针+1取模
	return true;
}

bool DeQueue(SQueue& Q, ElemType& e)
{
	if(Q.front == Q.rear) return false;	//判断队列是否为空
	e = Q.data[Q.front];
	Q.front = (Q.front+1) % MAX_SIZE；	//队头指针+1取模
	return true;
}

int Length(SQueue& Q)
{
	return (Q.rear - Q.front + MAX_SIZE) % MAX_SIZE;
}

void print(SQueue &queue)
{
	if(isEmpty(queue)) return;	//判断队列是否为空
	int node_front=queue.front;
	while(node_front<queue.rear)
	{
		printf("%d ",queue.data[node_front]);
		node_front=(node_front+1)%MAX_SIZE;
	}
	printf("\n");
}

